npm 如何安装私有包

最近在公司负责了一个类似 element-ui 的 vue ui 库的开发,然后在如何合理分发的问题上遇到了麻烦。
因为想要用起来更加方便,那么如何简单的安装使用起来显然也是需要考虑的问题。
最终我们决定通过 npm 包管理的方式来分发使用我们的内部 ui 库。
毕竟 npm install package 几乎是现实的标准了,也是前端最为熟悉的方式了,不过这也引发了额外一个问题。
我们的内部 ui 库是放在公司内部的私有 gitlab 仓库当中,也并没有发包到 npm 上,自然还是需要格外做一些工作。

npm 常见安装包的方式

先让我们回顾一下 npm 的安装方式。
根据官网,撇开额外的 common options, npm install 可以处理的方式有如下 10 种,让我们来复习一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 不带任何参数,默认搜索安装当前目录下的package.json 中记录的包
npm install (with no args, in package dir)
// 根据 npm 服务器上记录的包名安装,这也是最常见的安装单个包的方式了
npm install [<@scope>/]<name>
// 类似的,可以通过包名 name后加 @ 带上 `tag` `version`` version range` 等相关信息来更加明确的指定需要安装包的版本
// 另外也可以在包名前带上命名空间来区分不同组织或者个人名下的相同名字的包。
// 比如 lodash/has 跟 someone/has 包名都是 has,但是从属于不同的命名空间。
// 不过上传包裹带上命名空间是付费玩家的特权,这又是另一个话题,就不过渡展开了。
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
// npm 也支持直接通过 git 仓库地址安装 git-host 默认当然是 github ,因此其实也可以忽略,只要 <git-user>/<repo-name>
// 比如去年如果你要使用 gulp v4 的话你实际上需要 npm gulpjs/gulp.git#4.0 的方式来安装
// 这里实际上还有非常的多的可配置写法,来指向不同 git仓库比如gitlab,github等各种不同的分支,具体可以参照npm官网啦
npm install <git-host>:<git-user>/<repo-name>
// 又或者直接通过 git 仓库的 url 访问到对应的 git 仓库
npm install <git repo url>
// 接下来则是通过直接给出包裹的 tar压缩包本地或远程地址来,安装一个经过压缩的 npm 包
npm install <tarball file>
npm install <tarball url>
// 又或者最为直接的,传入一个文件夹路径,来安装一个 npm 包
npm install <folder>

通过 url 的方式安装

那么既然我那个ui库放在在了 gitlab 中,当然是通过 npm install <git-host>:<git-user>/<repo-name> 或者 npm install <git repo url>
不过npm install <git repo url> 很快就被否决了

问题在于权限

是的,因为这是我司的私有 gitlab 仓库,虽然可以通过公网访问的到,但是必须经过登陆验证,才能得到最基础的访问权限,当然,这是为了保障安全所必需的。
因此 npm install <git repo url> 会通过 http/https 的方式去访问 git 仓库,无法通过登陆获得有效的权限。
虽然好像是可以通过命令行跳转访问登陆作为解决方案,就像使用 git 的时候直接通过命令行登陆那样。
但仔细想想就知道其实是不行的,因为这只适用于与单次安装访问。
如果git repo url 是写在 package.json 当中的话,你总不能在每次 npm install 安装的时候都要求用户登录,
除非你觉得把登陆账号密码保存到什么脚本上来自动登陆是个绝佳的方法。

通过 ssh 访问

嘛,所以最终就剩下 npm install <git-host>:<git-user>/<repo-name> 的方式,
而这个与 npm install <git repo url>的区别就是可以通过 ssh 对 git 仓库进行访问,这就避免了登陆的问题了。

具体的配置方式是

1
2
3
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
// 更具体的示例
git+ssh://git@xxx.net/xxx.git#v1.0.0

其中 protocol 使用 git+ssh, 由于已经用了 ssh 所以 user/password 就不需要了,除此之外://后的一长串的东西其实也不需要记,直接从对应的 git 仓库的分支上把链接复制下来就好了。
当然对应不同的平台多多少少有些不同,如果要更详细的说明的话k看npm官方的文档吧